home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C++ / Code Resources / Windows 95 MDEF / Sourcery / MDEF Stumbling.doc < prev    next >
Text File  |  1995-12-01  |  9KB  |  202 lines

  1. Subject: Writing MDEF->scratching head!
  2. From: starlabs@aol.com (StarLabs)
  3. Date: 30 Nov 1995 04:30:50 -0500
  4. Message-ID: <49jtka$df8@newsbf02.news.aol.com>
  5.  
  6. I'm writing a custom MDEF which mainly draws text, not graphics. So it has
  7. to support submenus. Consequently I'm having problems with submenus and
  8. popup menus. The submenu problem is my greatest concern:
  9.  
  10. Whenever the mouse is moved over a menu item in my MDEF menu the submenu
  11. is positioned according to the *mouse location*. This is NOT how the
  12. system MDEF handles this (the submenu is positioned correctly next to the
  13. menu item regardless of the mouse location). So if the mouse is near the
  14. bottom of the menu item the submenu is placed lower; if the mouse is near
  15. the top of the menu item the submenu is placed higher. For the system
  16. MDEF, the submenu's location is always constant, the submenu's top flushed
  17. with the top of the menu item. Any ideas on what I'm missing?
  18.  
  19. However, this is not the biggest problem.
  20.  
  21. The biggest problem: After the submenu is shown it's sent a total of 5
  22. mDrawMsg calls! I added a SysBeep() to the routine which handles mDrawMsg
  23. so I know the submenu is getting redundant mDrawMsg calls. This results in
  24. the menu being erased and redrawn, causing flicker. So why is my MDEF
  25. getting these redundant mDrawMsg messages?
  26.  
  27. I checked the older Concordia MDEF (on the bookmark CD) and it seems to be
  28. having this problem too. My MDEF uses as its basis the MDEF sample taken
  29. from THINK Reference - admittedly old but looking at it I can't see
  30. anything wrong. My best guess is the problem is confined not to my
  31. mDrawMsg handler but rather my mChooseMsg handler, below (gutted and
  32. simplified, but still works and still has problems!):
  33.  
  34. void DoChooseMsg(
  35.  MenuHandle whichMenu,
  36.  Rect  *menuRect,
  37.  Point  hitPt,
  38.  short  *itemID) {
  39.  
  40.   short mouseItem;
  41.   short oldItem = *itemID;
  42.   
  43.   mouseItem = FindMenuItem(whichMenu, menuRect, hitPt);
  44.  
  45.   if (mouseItem==0) {
  46.      DrawMenuItem(whichMenu, menuRect, oldItem, kMenuUnhilited);
  47.      *itemID=0;
  48.   }
  49.   else if ( mouseItem != *itemID ) {
  50.      DrawMenuItem(whichMenu, menuRect, oldItem, kMenuUnhilited);
  51.      DrawMenuItem(whichMenu, menuRect, mouseItem, kMenuHilited);
  52.      *itemID = mouseItem;
  53.   }
  54. } // END DoChooseMsg
  55.  
  56. Or is there some quirks in the Menu Manager that I have to know to make
  57. the MDEF work correctly? I am seriously puzzled about this one... (And I
  58. haven't even mentioned the pop-up menu problem!) One bug at a time. :-o
  59.  
  60. Thanks in advance for any pointers,
  61. --Hiep
  62.  
  63. ----------
  64.  
  65. Subj:  Re: Writing MDEF->scratching head!
  66. Date:  Thu, Nov 30, 1995 9:55 AM PST
  67. From:  jordanz@altura.com
  68. X-From:    jordanz@altura.com (Jordan Zimmerman)
  69. To:    starlabs@aol.com (StarLabs)
  70.  
  71. (A copy of this message has also been posted to the following newsgroups:
  72. comp.sys.mac.programmer.help)
  73.  
  74. > The biggest problem: After the submenu is shown it's sent a total of 5
  75. > mDrawMsg calls! I added a SysBeep() to the routine which handles mDrawMsg
  76. > so I know the submenu is getting redundant mDrawMsg calls. This results in
  77. > the menu being erased and redrawn, causing flicker. So why is my MDEF
  78. > getting these redundant mDrawMsg messages?
  79.  
  80. This is because you are not setting the mbItemRect in the mbSaveLoc. You
  81. don't know what these are, you say? Well maybe that's because they've
  82. never been documented ... anywhere!
  83.  
  84. Anyway, if you closely read the System 6 System MDEF provided on the Apple
  85. Developer CDs, you'll see that it sets this funky low-level global
  86. mbItemRect. The only #defines I've seen for it are in the MPW assembly
  87. interfaces in a file called privates.a. Once you properly set, the
  88. problems you've mentioned magically go away. Go figure...
  89.  
  90. -- 
  91. Jordan Zimmerman, Altura Software
  92. home page: http://www.altura.com/jordanz
  93. Spock's Beard: http://www.altura.com/spocks_beard
  94.  
  95.  
  96. ----------------------- Headers --------------------------------
  97. From jordanz@altura.com  Thu Nov 30 12:55:20 1995
  98. Return-Path: jordanz@altura.com
  99. Received: from scruz.net (nic.scruz.net [165.227.1.2]) by emin06.mail.aol.com (8.6.12/8.6.12) with ESMTP id MAA10744 for <starlabs@aol.com>; Thu, 30 Nov 1995 12:55:04 -0500
  100. Received: from 204.147.232.52 by scruz.net (8.6.9/1.34)
  101.     id JAA13505; Thu, 30 Nov 1995 09:23:44 -0800
  102. Message-Id: <199511301723.JAA13505@scruz.net>
  103. Date: Thu, 30 Nov 1995 09:23:27 -0900
  104. From: jordanz@altura.com (Jordan Zimmerman)
  105. To: starlabs@aol.com (StarLabs)
  106. Subject: Re: Writing MDEF->scratching head!
  107. Newsgroups: comp.sys.mac.programmer.help
  108. References: <49jtka$df8@newsbf02.news.aol.com>
  109. Organization: Altura Software, Inc.
  110.  
  111. ---------
  112.  
  113. Subject: Re: Writing MDEF->scratching head!
  114. From: starlabs@aol.com (StarLabs)
  115. Date: 1 Dec 1995 04:19:32 -0500
  116. Message-ID: <49mhb4$gjr@newsbf02.news.aol.com>
  117.  
  118. >>
  119. This is because you are not setting the mbItemRect in the mbSaveLoc. You
  120. don't know what these are, you say? Well maybe that's because they've
  121. never been documented ... anywhere!
  122. >>
  123.  
  124. Thanks - I had a sneaking suspicion something like this was the reason,
  125. but I couldn't believe Apple would withold info from programmers that
  126. would prevent them from writing WORKING code! I should have known
  127. better...
  128.  
  129. Anyway, after careful reading of some sample MDEFs I had done as you had
  130. suggested and voila! No more submenu flashing when the mouse was over a
  131. menu item which pointed to a submenu. However, I'm still having problems
  132. with the submenu still being placed erratically:
  133.  
  134. The submenu itself seems to alternate between being located high or low in
  135. relation to the menu item which points to it, probably also being partly
  136. determined by the mouse's location, NOT the menu item's rect. Aargh!
  137. Unlike the system MDEF, where the submenu is placed flushed top with the
  138. menu item, regardless of the mouse's location.
  139.  
  140. I tried fiddling with mbUglyScroll. I also implemented fiddling with the
  141. MenuDisable low-mem global. But to no avail. Any suggestions? Do I have to
  142. look in mChooseMsg or mPopupMsg for this problem?
  143.  
  144. Thanks,
  145. --Hiep
  146.  
  147.  
  148. // ---------------------------------------------------------------------------
  149.  
  150. Taken from Private.a...
  151.  
  152. ; equates for dynamic menuList structure
  153. ;
  154. ;----- Part 1 -- regular menus
  155. mbResID           EQU         4                         ; menuBar variant offset in menuList [word]
  156. menu1Size         EQU         mbResID + 2               ; Must be = 6 forever!!!
  157.  
  158. ;----- Part 2 -- hierarchical menus
  159. lastHMenu         EQU         0                         ; offset in HMenu part of dynamic menuList [word]
  160. menuTitleSave     EQU         lastHMenu + 2             ; handle to saved bits behind title rectangle [handle]
  161. menu2Size         EQU         menuTitleSave+4           ; size of HMenu entry
  162. menuHoH           EQU         0                         ; hierarchical menu [handle]
  163.  
  164. ;----- Size of menuList at InitMenus time -- no menus, no hierarchical menus
  165. initMListSize     EQU         menu1Size + menu2Size
  166. ; equates for mbarproc's save structure created when it receives Init Msg (Msg #3)
  167. ;
  168. ;----- Header
  169. lastMBSave        EQU         0                         ; offset to last menu saved in structure [word]
  170. mbCustomStorage   EQU         lastMBSave + 2            ; private storage for custom mbarproc's [handle]
  171. mbItemRect        EQU         mbCustomStorage + 4       ; rect of currently chosen menu item [rect]
  172. mbMenuDelay       EQU         mbItemRect + 8            ; get MenuDelay from paramram and store here [byte]
  173. mbMenuDrag        EQU         mbMenuDelay + 1           ; get MenuDrag from paramram and store here [byte]
  174. mbUglyScroll      EQU         mbMenuDrag + 1            ; flag to tell whether HMenu has been brought [word]
  175. ; before scrolling happens
  176. mbIconState       EQU         mbUglyScroll + 2          ; Place to save NMgr icon state
  177. mbHeader          EQU         mbIconState + 2           ; size of mb save header [$14]
  178. ; !!!!! CAUTION: mbHeader MUST be smaller than mbEntrySize !!!!!
  179.  
  180. ;----- Entry
  181. mbRectSave        EQU         0                         ; rectangle of menu on screen [8 bytes]
  182. mbBitsSave        EQU         mbRectSave + 8            ; handle to saved bits behind menu rectangle
  183. mbMenuDir         EQU         mbBitsSave + 4            ; direction menu was placed on screen,
  184. ; to right or left of title (if first menu) 
  185. ; or previous menu (if hierarchical menu)
  186. mbMLOffset        EQU         mbMenuDir + 2             ; 6 byte offset of menu in menuList [word]
  187. mbMLHandle        EQU         mbMLOffset + 2            ; handle of menu in menuList
  188. mbTopScroll       EQU         mbMLHandle + 4            ; top scrolled to menu item, from global topMenuItem [word]
  189. mbBotScroll       EQU         mbTopScroll + 2           ; bottom scrolled to menu item, from global atMenuBottom [word]
  190. mbReserved        EQU         mbBotScroll + 2           ; reserved field [long]
  191. mbEntrySize       EQU         mbReserved + 4
  192. mbSaveSize        EQU         mbEntrySize*6             ; x-byte header and 5 entries of x-bytes each
  193. firstAltMenuCmd   EQU         $1B
  194. altMenuCmd1       EQU         $1D                       ; itemCmd == $1D ==> unused indicator reserved for future Apple use
  195. altMenuCmd2       EQU         $1E                       ; itemCmd == $1E ==> unused indicator reserved for future Apple use
  196. altMenuCmd3       EQU         $1F                       ; itemCmd == $1F ==> unused indicator reserved for future Apple use
  197. lastAltMenuCmd    EQU         $1F
  198. mbRightDir        EQU         0                         ; menu went to the right (direction)
  199. mbLeftDir         EQU         1                         ; menu went to the left (direction)
  200. menuDelay         EQU         $7E                       ; param ram locations for user settable
  201. menuDrag          EQU         $7F                       ; hierarchical menu delay and drag ticks
  202.